package com.itheima.blog.admin.controller;


import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONUtil;
import com.github.wxpay.sdk.WXPayUtil;
import com.itheima.blog.admin.config.WxPayConfig;
import com.itheima.blog.admin.entity.WeChatPay;
import com.itheima.blog.admin.service.WeChatPayService;
import com.itheima.blog.util.WeChatPayUtils;
import org.springframework.web.bind.annotation.*;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * 微信支付控制层
 * lhd
 */
@RestController
@RequestMapping(value = "/admin")
@Slf4j
public class WeChatPayController {
    @Resource
    private WxPayConfig payProperties;

    /**
     * 微信支付 统一预下单接口
     * @author lhd
     */
    @GetMapping(value = "/createNative")
    public Map<String, Object> createNative(HttpServletRequest request) {
        Map<String, Object> ResultMap = new HashMap<String, Object>();
        try {
            WeChatPay weChatPay = new WeChatPay();
            weChatPay.setAppid(payProperties.getAppid())//公众号appid
                    .setMch_id(payProperties.getMch_id()) // 商户号
                    .setApi_key(payProperties.getApi_key())//api密钥
                    .setNonce_str(WXPayUtil.generateNonceStr())// 32位随机字符串
                    .setBody("小米MIX3 12+568国行陶瓷黑")// 商品描述
                    .setTotal_fee("0.01") //标价金额
                    .setOut_trade_no(IdUtil.simpleUUID())// 商户订单号 唯一
                    .setSpbill_create_ip(WeChatPayUtils.getIp(request))// 终端IP
                    .setNotify_url("https://www.baidu.com")//异步回调地址
                    .setTrade_type("NATIVE") // 交易类型 JSAPI--JSAPI支付（或小程序支付）、NATIVE--Native支付、APP--app支付，MWEB--H5支付
                    .setSub_mch_id("1609469848")//子商户号 微信支付 分配的子商户号（服务商模式的时候填入）
                    .setAttach("shuqingyou");//附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
            return WeChatPayService.Unifiedorder(weChatPay);
        } catch (Exception e) {
            ResultMap.put("code", 2);
            ResultMap.put("msg", "系统异常错误代码：" + e.getMessage());
            e.printStackTrace();
        }
        return ResultMap;
    }

    /**
     * 查询微信订单交易状态
     * @author shuqingyou 2022/9/17
     * @param request
     * @param response
     * @return
     */
    @PostMapping (value = "/QueryPayStatus")
    @ResponseBody
    public Map<String, Object> QueryPayStatus(HttpServletRequest request, HttpServletResponse response) {
        Map<String, Object> ResultMap = new HashMap<String, Object>();
        try {
            //todo // 商户订单号 唯一
            String out_trade_no = request.getParameter("out_trade_no");
            WeChatPay weChatPay = new WeChatPay();
            weChatPay.setAppid(payProperties.getAppid())//公众号appid
                    .setMch_id(payProperties.getMch_id()) // 商户号
                    .setApi_key(payProperties.getApi_key())//api密钥
                    .setNonce_str(WXPayUtil.generateNonceStr())// 32位随机字符串
                    .setOut_trade_no(out_trade_no)// 商户订单号 唯一
                    .setSub_mch_id("1609469848");//子商户号 微信支付 分配的子商户号（服务商模式的时候填入）

            /**查询订单交易状态**/
            return WeChatPayService.QueryPayStatus(weChatPay);
        } catch (Exception e) {
            ResultMap.put("code", 2);
            ResultMap.put("msg", "系统异常错误代码：" + e.getMessage());
            e.printStackTrace();
        }
        return ResultMap;
    }

    /**
     * 微信支付异步回调通知接口
     * lhd
     * @param request
     */
    @PostMapping(value = "/WeChatPayCallback")
    public void WeChatPayCallback(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        try {
            out = response.getWriter();
            Map<String, Object> ResultMap = WeChatPayService.WeChatPayCallback(request, payProperties.getApi_key());
            if (ResultMap.get("Verify").equals("YES")) {
                //todo 验签成功
                System.out.println("验签成功");
                //返回xml格式数据给微信(以免微信重复调用该接口)
                out.write(String.valueOf(ResultMap.get("returnWeChat")));
                Map<String, String> WxResultMapData = (Map<String, String>) ResultMap.get("data");
                log.info("收到微信回调：{}", JSONUtil.toJsonStr(WxResultMapData));
            } else if (ResultMap.get("Verify").equals("NO")) {
                //todo 验签失败
                System.out.println("验签失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        out.flush();
        out.close();
    }

}

